home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / CONTRSRC.ZIP / SRC / GOPI / GOPI.ASM < prev    next >
Encoding:
Assembly Source File  |  1994-11-20  |  25.6 KB  |  1,028 lines

  1. ;*******************************
  2. ; GOPI's Dots (C) TFL-TDV 1994 *
  3. ;*******************************
  4.  
  5.  
  6.    INCLUDE  PDFIK.INC
  7.    INCLUDE  VIDEO.INC
  8.    INCLUDE  PLAYINFO.INC
  9.  
  10. ;*****************************************************************************
  11. ;                          Structure mémoire ...
  12. ;*****************************************************************************
  13. .386
  14.         DGROUP GROUP _DATA, _BSS
  15.         GOPI_TEXT SEGMENT DWORD PUBLIC USE16 'CODE'
  16.                 ASSUME cs:GOPI_TEXT, ds:GOPI_DATA, fs:DGROUP
  17.         GOPI_TEXT ENDS
  18.         _DATA SEGMENT DWORD PUBLIC USE16 'DATA'
  19.         _DATA ENDS
  20.         _BSS SEGMENT DWORD PUBLIC USE16 'BSS'
  21.         _BSS ENDS
  22.         GOPI_DATA SEGMENT DWORD PRIVATE USE16 'FAR_DATA'
  23.         GOPI_DATA ENDS
  24. ;*****************************************************************************
  25. GOPI_DATA SEGMENT
  26.  
  27.  include angles.inc
  28.  ;contient les 360 valeurs du sinus et du cosinus multipliées par 256
  29.  ;label= cos,sin (Dword)
  30.  
  31.  include pal1.inc
  32.  include fgopi.inc
  33.  include data1.inc         ;Demi-sphere
  34.  include data2.inc         ;Pyramide
  35.  include data3.inc         ;Fosse+pyramide
  36.  include data4.inc         ;Fosses
  37.  include data5.inc         ;Fosse+TDV
  38.  include data6.inc         ;Barriere+TFL
  39. ;*****************************************************************************
  40. CURRENT_PAGE    DW      0                      ; offset page courante
  41. PAGE_SIZE       EQU     16000                  ; taille d'une page en bytes
  42. PLANE_BITS      EQU     03h                    ; Bits 0-1 of Xpos = Plane #
  43. MAP_MASK_PLANE1 EQU     00102h                 ; Map Register + Plane 1
  44. PAGE_ADDR       DW      0, 16000, 32000, 48000 ; offsets de chaque page
  45. VISUAL_PAGE     DW      0                      ; page affichée
  46. ACTIVE_PAGE     DW      0                      ; page active
  47. VERT_RETRACE    EQU     08h                    ; INPUT_1: Vertical Retrace Bit
  48. CRTC_Index      EQU     03D4h                  ; Contrôleur crt VGA
  49. START_DISP_LO   EQU     00Dh                   ; CRTIndex: display start lo
  50. START_DISP_HI   EQU     00Ch                   ; CRTIndex: display start hi
  51. INPUT_1         EQU     03DAh                  ; Registre statut d'input #1
  52. ALL_PLANES_ON   EQU     00F02h                 ; Map Register + All Bit Planes
  53. SC_Index        EQU     03C4h                  ; Contrôleur séquenceur VGA
  54. VIO_SEG         word    ?
  55. CPU_FLAG        word    ?                      ; pour le temps cpu
  56. SW              word    ?                      ; pour le switchage des pages
  57. Larg=320
  58. Haut=200
  59. Screen1 = 0
  60. Screen2 = (Larg*Haut/4)
  61.  
  62. EVEN
  63. ; - Plot Tables -
  64. XTable LABEL WORD         ; Table prémultipliée des abscisses
  65.        i = 0
  66.        REPT Larg
  67.        dw (1 SHL (i AND 3)), i SHR 2 ; Plane number + Hor. offset
  68.        i = i + 1
  69.        ENDM
  70.  
  71. YTable LABEL WORD         ; Table prémultipliée des ordonnées
  72.        i = 0
  73.        REPT  Haut         ; Hauteur Screen en pixels
  74.        dw i
  75.        i = i + Larg/4     ; Largeur Screen en pixels
  76.        ENDM
  77.  
  78. Dest DW 0
  79.  
  80. ;*****************************************************************************
  81. xv      EQU 0
  82. yv      EQU 1024*4
  83. zv      EQU 1024*2*4
  84. vv      EQU 1024*3*4
  85. savpos1 EQU 1024*4*4
  86. savpos2 EQU 1024*5*4
  87. savptr  WORD savpos1,savpos2
  88.  
  89. HeapSeg WORD ?
  90. HeapSize EQU 1024*4+xv+yv+zv+vv+savpos1+savpos2
  91.  
  92. ; xv           DWORD  1024 DUP(0)      ;vecteur de travail en x
  93. ; yv           DWORD  1024 DUP(0)      ;vecteur de travail en y
  94. ; zv           DWORD  1024 DUP(0)      ;vecteur de travail en z
  95. ; vv           DWORD  1024 DUP(0)      ;vecteur de travail couleur
  96. ; savpos1      DWORD  1024 DUP(0)      ;vecteur ou on sauve coordonees
  97. ; savpos2      DWORD  1024 DUP(0)      ;associées aux points
  98. ; savptr       WORD   OFFSET savpos1,OFFSET savpos2 
  99.  
  100.  pagescr      byte  ?
  101.  x            word  ?                 ;nécessaire pour la routine
  102.  y            word  ?                 ;...setpix!
  103.  couleur      byte  ?                 ;
  104.  agr          byte  6                 ;agrandissement
  105.  agl          word  0                 ;angle de rotation
  106.  trs          byte  0                 ;deformation
  107.  trs_flag     byte  0                 ;deformation
  108.  save         word  ?                 ;variable!
  109.  
  110. ;---- param pour synchro avec zizik ----
  111. EVEN
  112. DebSong  WORD ?
  113. FinSong  WORD ?
  114.  
  115.  
  116. ;---- param pour fading ----
  117. Timeleft  WORD ?        ; temps restant pour execution
  118. FadeFlag WORD ?        ; flag pour fading
  119. FadePtr1 WORD 2 DUP(?) ; ptr sur palette a fader
  120. FadePtr2 WORD 2 DUP(?)
  121. Delai    WORD ?
  122. Termine  WORD 0 ;?        ; flag pour terminer !!!
  123.  
  124.  
  125. GOPI_DATA ENDS
  126. ;*****************************************************************************
  127. _DATA SEGMENT
  128.  
  129. EXTRN _BlackPal: BYTE
  130. EXTRN _WhitePal: BYTE
  131.  
  132. _DATA ENDS
  133.  
  134. _BSS SEGMENT
  135.  
  136.         EXTRN _FrameCounter     : WORD
  137.     EXTRN _ExitDemo         : WORD
  138.     EXTRN _CPUtime          : WORD
  139.         EXTRN _SpaceBar         : WORD
  140.     EXTRN _StartAdr         : WORD
  141.     EXTRN _WorkAdr          : WORD
  142.     EXTRN _NextAdr          : WORD
  143.     EXTRN _Triple           : WORD
  144.     EXTRN _SyncFlag         : WORD
  145.  
  146.         ;!!!!!!!!!! sync music !!!!!!!!!!
  147.         EXTRN _MP               : DWORD ; extern ModulePlayer * MB
  148.         EXTRN _ReplayInfo       : mpInformation
  149.  
  150. EXTRN _TmpPal           : BYTE
  151. EXTRN _FadeON           : WORD
  152.  
  153. _BSS ENDS
  154. ;*****************************************************************************
  155. GOPI_TEXT SEGMENT
  156.      EXTRN _AveragePAL: FAR
  157.  
  158.                  EXTRN   _WaitVBL : FAR
  159.                  PUBLIC  _GOPI
  160.  
  161.  include video1.inc   ;openvideo
  162.                       ;closevideo
  163.                       ;load_pal
  164.                       ;waitvrt
  165.  include video2.inc   ;clear_vga_screen
  166.                       ;set_visual_page
  167.                       ;set_active_page
  168.                       ;setpix
  169.                       ;cpu_time
  170.                       ;sw_pages
  171.                       ;out_16
  172.  include divers.inc   ;free_keyboard
  173.  include transf1.inc  ;     transf1                ;agrandissement
  174.  include transf2.inc  ;     transf2a               ;rotation z
  175.                       ;     transf2b               ;rotation x
  176.                       ;     transf2c               ;rotation y
  177.  
  178.  include transf3.inc  ;     transf3a               ;rotation zx
  179.                       ;     transf3b               ;rotation zy
  180.                       ;     transf3c               ;rotation xy
  181. ;*****************************************************************************
  182. MPUSH macro reg1:req,reg2:vararg
  183.       push reg1
  184.       ifnb <reg2>
  185.       mpush reg2
  186.       endif
  187.       endm
  188. ;*****************************************************************************
  189. MPOP macro reg1:req,reg2:vararg
  190.       ifnb <reg2>
  191.       mpop reg2
  192.       endif
  193.       pop reg1
  194.       endm
  195. ;*****************************************************************************
  196.  
  197. ClearDots MACRO
  198.       LOCAL labl
  199.  
  200.       MPUSH ax,cx,dx,si,di,es
  201.  
  202.       mov  ax,savptr       ; swap save buf !!!
  203.       xchg ax,savptr+2
  204.       mov  savptr,ax
  205.  
  206.  
  207.       mov  dx,3c4h
  208.       mov  ax,0f02h
  209.       out  dx,ax           ; enable all bitplanes !!!!
  210.  
  211.       mov  ax,0a000h
  212.       mov  es,ax
  213.       xor  al,al
  214.       mov  si,savptr       ; ptr on save-vector
  215.  
  216.       mov  cx,nbdots
  217. labl: mov  di,WORD PTR gs:[si] ; take coord
  218.       add  si,4 
  219.       stosb                ; clear dot !!!!
  220.       dec  cx
  221.       jnz  labl      
  222.  
  223.  
  224.       MPOP ax,cx,dx,si,di,es
  225.  
  226. ENDM
  227.  
  228. loaddots macro vx,vy,vz:req
  229.          local bcl1
  230.          MPUSH ax,bx,cx,si         
  231.     
  232.          xor  bx,bx
  233.          xor  si,si
  234.          xor  eax,eax
  235.          mov  cx,nbdots
  236. bcl1:
  237.          mov  al,BYTE PTR VX[bx]
  238.          mov  BYTE PTR gs:xv[si],al
  239.  
  240.          mov  al,BYTE PTR VY[bx]
  241.          mov  BYTE PTR gs:yv[si],al
  242.  
  243.          mov  al,BYTE PTR vz[bx]
  244.          mov  BYTE PTR gs:vv[si],al
  245.          sub  al,6            ;6 = maxz div 2
  246.          mov  BYTE PTR gs:zv[si],al
  247.  
  248.          inc  bx
  249.          add  si,4
  250.  
  251.          dec  cx
  252.          jnz  bcl1
  253.  
  254.          MPOP ax,bx,cx,si 
  255. endm
  256. ;*****************************************************************************
  257. convdots macro vz2,vz1:req
  258.          local bcl1
  259.          MPUSH ax,bx,cx,dx,si
  260.  
  261.          xor  bx,bx
  262.          xor  si,si
  263.          mov  cx,nbdots
  264. bcl1:
  265.          mov   al,trs
  266.          mul   BYTE PTR vz1[si]
  267.          mov   dx,ax               ;save=vz1*trs
  268.  
  269.          mov   al,16
  270.          sub   al,trs              ;al=16-trs
  271.  
  272.          mul BYTE PTR vz2[si]      ;ax=(16-trs)*vz2
  273.  
  274.          mov di,dx
  275.          add ax,di                 ;ax=(16-trs)*vz2+vz1*trs
  276.          shr ax,4                  ;ax=ax /16
  277.          mov BYTE PTR gs:zv[bx],al
  278.          mov BYTE PTR gs:vv[bx],al    ; only LSB used for color !!!!
  279.  
  280.          add  bx,4
  281.          inc  si
  282.  
  283.          dec  cx
  284.          jnz  bcl1
  285.  
  286.          MPOP ax,bx,cx,dx,si
  287. endm
  288. ;*****************************************************************************
  289. inctrs1 macro
  290.         local suit1,suit2,suit3,decrm
  291.  push ax
  292.  
  293. ;incremente et decremente la transformation
  294.  mov al,trs_flag
  295.  test al,al
  296.  jnz decrm
  297.  mov al,trs
  298.  inc al         ;flag=0 =>inc
  299.  jmp suit1
  300. decrm:          ;flag=1 =>dec
  301.  mov al,trs
  302.  dec al
  303. suit1:
  304.  mov trs,al
  305.  
  306.  cmp al,16
  307.  jb suit2
  308.  mov trs_flag,1  ; >16 =>  flag=1
  309. suit2:
  310.  cmp al,0
  311.  jg  suit3
  312.  mov trs_flag,0  ; =<0 =>  flag=0
  313. suit3:
  314.  
  315.  pop ax
  316. endm
  317. ;*****************************************************************************
  318. inctrs2 macro
  319.         local suit1
  320.   push ax
  321.  
  322. ;incremente  la transformation
  323.   mov al,trs
  324.   cmp al,16
  325.   jb suit1
  326.   mov al,15
  327. suit1:
  328.   inc al
  329.   mov trs,al
  330.  
  331.   pop ax
  332. endm
  333. ;*****************************************************************************
  334. READ_KEY MACRO
  335.        LOCAL l1,l2,l3,l4
  336.  
  337.        in      al, 60h                            ; buffer clavier
  338.        cmp     al, 78                             ; '+' ?
  339.        jnz     l1
  340.        mov     WORD PTR ds:[cpu_flag], 1
  341.        mov     WORD PTR fs:[_CPUtime],1
  342.        Free_Keyboard
  343. l1:    cmp     al, 74                             ; '-' ?
  344.        jnz     l2
  345.        mov     WORD PTR fs:[_CPUtime],0
  346.        mov     WORD PTR ds:[cpu_flag], 0
  347.        Free_Keyboard
  348. l2:    cmp     al,39h                             ; spacebar ?
  349.        jne     l3
  350.        mov     fs:_SpaceBar,1                     ; skip part
  351.        Free_KeyBoard
  352.        jmp     fin
  353. l3:    cmp     al, 1                              ; esc ?
  354.        jne     l4
  355.        mov     fs:_ExitDemo,1                     ; exit demo
  356.        Free_KeyBoard
  357.        jmp     fin
  358.  
  359. l4:
  360.  
  361.        ENDM
  362. ;*****************************************************************************
  363. _GOPI PROC FAR
  364.  
  365.         push    bp
  366.         mov     bp, sp
  367.         pushad
  368.         MPUSH   ds,es,fs,gs
  369.  
  370.         mov     ax,GOPI_DATA ; set GOPI data
  371.         mov     ds,ax
  372.         mov     ax,DGROUP
  373.         mov     fs,ax
  374.  
  375. ;------- recuperer parametres sur le stack !!!! --------
  376.  
  377.          push    eax
  378.          mov     ax,WORD PTR ss:[bp+6]  ; debut pos
  379.          shl     eax,14
  380.          or      ax,WORD PTR ss:[bp+8]  ; debut row
  381.          or      ah,al
  382.          shr     eax,8
  383.          mov     DebSong,ax
  384.          mov     ax,WORD PTR ss:[bp+10] ; fin pos
  385.          shl     eax,14
  386.          or      ax,WORD PTR ss:[bp+12] ; fin row
  387.          or      ah,al
  388.          shr     eax,8
  389.          mov     FinSong,ax
  390.          xor     eax,eax
  391.          pop     eax
  392.  
  393. ;-------------------------------------------------------
  394.  
  395.  
  396.         push    m320x200x256p    ; set 320x200x256 tweaked 
  397.         call    _SetVGA
  398.         add     sp, 2
  399.  
  400. ;---- wait right position/row in tune ----
  401.  
  402.         MPUSH   eax,bx,ds,es,fs
  403.  
  404.         ASSUME  ds:DGROUP
  405.         ASSUME  fs:GOPI_DATA
  406.         mov     ax,DGROUP
  407.         mov     ds,ax
  408.         mov     ax,GOPI_DATA   ; XCHG DS,FS !!!!
  409.         mov     fs,ax
  410.  
  411. ;;;;; attente bonne position music ;;;;; plante ???
  412. WaitPos:
  413.          mov     _ReplayInfo.numChannels,4 ; 4 voices
  414.  
  415.          les     bx,DWORD PTR [_MP]
  416.          push    ds
  417.          push    OFFSET _ReplayInfo
  418.  
  419.          ; _MP->GetInformation(&ReplayInfo)
  420.  
  421.          call    (ModulePlayer PTR es:[bx]).GetInformation
  422.          add     sp,4
  423.  
  424.          xor     eax,eax
  425.          mov     ax,_ReplayInfo.pos
  426.          shl     eax,14
  427.          or      ax,_ReplayInfo.row
  428.          or      ah,al
  429.          shr     eax,8
  430.          cmp     ax,WORD PTR fs:[DebSong]  ; is it time ????
  431.          jb      WaitPos
  432.          xor     eax,eax
  433. ;;;;;;;;; plante ???????
  434.          ASSUME  ds:GOPI_DATA
  435.          ASSUME  fs:DGROUP
  436.       
  437.          MPOP    eax,bx,ds,es,fs
  438.  
  439. ;------------------------------------------
  440.  
  441.  
  442.  
  443. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  444.          mov     ax,DGROUP
  445.          mov     fs,ax
  446.          mov     ax,GOPI_DATA
  447.          mov     ds,ax
  448. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  449.  
  450.          mov     ah,48h                ; MALLOC
  451.          mov     bx,(HeapSize SHR 4)+1 ; memory requested
  452.          int     21h
  453.          mov     HeapSeg,ax            ; Segment address returned
  454.          mov     gs,ax                 ; GS = Heap !!!!!
  455.  
  456.  
  457.          mov     ax,fs:_CPUtime
  458.          mov     cpu_flag,ax
  459.  
  460. ; init ....
  461.           mov     Termine,0
  462.  
  463. ;;;;; plante ???? non !!!
  464.          mov     fs:_FadeON,0
  465.          mov     FadeFlag,0
  466.          mov     FadePtr1,OFFSET _BlackPal  ; Black to pic for the beginning !!!
  467.          mov     ax,fs
  468.          mov     FadePtr1+2,ax
  469.          mov     FadePtr2,OFFSET pal
  470.          mov     ax,ds
  471.          mov     FadePtr2+2,ax
  472.         ; mov     ax,fs:_FrameCounter
  473.         ; mov     Delai,ax
  474.          mov     fs:_FrameCounter,0
  475.          mov     Delai,0
  476. ;;;;; plante ???? non !!!
  477.  
  478.         mov     bx, fs:_StartAdr
  479.         mov     WORD PTR fs:[bx], screen1
  480.         mov     WORD PTR fs:[bx+2], 0
  481.         mov     bx, fs:_WorkAdr
  482.         mov     WORD PTR fs:[bx], screen2
  483.         mov     WORD PTR fs:[bx+2], 0
  484.         mov     fs:_Triple, 0
  485.         mov     fs:_SyncFlag, 1
  486.         call    _WaitVbl
  487. ;*****************************************************************************
  488. Part2:
  489.        cmp  fs:_SyncFlag, 1
  490.        jnz  Part2
  491.        mov  fs:_SyncFlag, 0
  492.  
  493. ;===================== Fade Palette ===========================
  494.  
  495. ;;;;;;;;;; plante pas !!!!!!
  496.  
  497.          cmp     FadeFlag,255
  498.          jb      NewFade
  499.  
  500.          mov     fs:_FadeON,0  ; plus fader ...
  501.  
  502.          cmp     Termine,1    ; Terminer si dernier fade fini
  503.          je      fin
  504.  
  505.          mov     fs:_FadeON,0    ; don't set _TmpPal anymore ...
  506.          jmp     @F
  507. NewFade: mov     ax,FadeFlag  ; average Black-MyPal
  508.          push    ax
  509.          push    fs
  510.          push    OFFSET _TmpPal
  511.          mov     ax,FadePtr1+2
  512.          push    ax         
  513.          mov     ax,FadePtr1
  514.          push    ax
  515.          mov     ax,FadePtr2+2 
  516.          push    ax
  517.          mov     ax,FadePtr2
  518.          push    ax
  519.          call    _AveragePAL
  520.          add     sp,7*2
  521.          mov     fs:_FadeON,1         ; set new PAL during next VR !!!!
  522.          mov     cx,fs:_FrameCounter
  523.          sub     cx,Delai             ; temps chargement
  524.          mov     Delai,0              ; plus delai ....
  525.          test    cx,cx
  526.          jnz     Faddi
  527.          mov     cx,1
  528. Faddi:   add     FadeFlag,4           ; inc fade ..
  529.          dec     cx
  530.          jnz     Faddi
  531. @@:
  532.  
  533. ;;;;;;; plante pas !!!!!!
  534.  
  535.  
  536.  
  537. ;==============================================================
  538.  
  539.        mov       ax,0a000h
  540.        mov       es,ax
  541.  
  542.        cpu_time  48
  543.        ClearDots
  544.     ;   clear_vga_screen       ; !!!!!!!! 
  545.  
  546.        cpu_time  32
  547.        loaddots  x32,y32,dt1  ;charge ds xv,xy,xz l'objet
  548.        convdots  dt1,dt2      ;transformation
  549.  
  550.        mov       bx,fs:_WorkAdr
  551.        mov       bx,WORD PTR fs:[bx]
  552.        mov       Dest,bx
  553.  
  554.        cpu_time  16
  555.        transf3a               ;rotation
  556.        cpu_time 0
  557.        inctrs2                ;incremente la transformation
  558.  
  559.        mov     bx,fs:_WorkAdr
  560.        mov     WORD PTR fs:[bx+2],1
  561.  
  562.        READ_KEY               ; read keyboard
  563.  
  564.       mov  ax,agl
  565.  
  566.       mov  cx,fs:_FrameCounter
  567.       test cx,cx
  568.       jnz  @F
  569.       mov  cx,1 
  570. @@:   add  ax,4*2
  571.       dec  cx
  572.       jnz  @B
  573.  
  574.       mov  fs:_FrameCounter,0
  575.  
  576.       cmp  ax,360*4    ;si l'angle >360° =>=0
  577.       jb   negal2 
  578.       xor ax,ax
  579.       mov trs,al
  580.       mov agl,ax
  581.       mov fs:_FadeON,0 ; fade off
  582.       Jmp part3
  583. negal2:
  584.       mov  agl,ax
  585.       jmp  part2
  586. ;*****************************************************************************
  587. Part3:
  588.        cmp  fs:_SyncFlag, 1
  589.        jne  Part3
  590.        mov  fs:_SyncFlag, 0
  591.  
  592.       mov       ax,0a000h
  593.       mov       es,ax
  594.  
  595.       cpu_time 48
  596.       ClearDots
  597.     ;  clear_vga_screen
  598.      
  599.       cpu_time 32
  600.       loaddots  x32,y32,dt2  ;charge ds xv,xy,xz l'objet
  601.       convdots  dt2,dt3      ;transformation
  602.  
  603.       mov       bx,fs:_WorkAdr
  604.       mov       bx,WORD PTR fs:[bx]
  605.       mov       Dest,bx
  606.  
  607.       cpu_time 16
  608.       transf3b
  609.       inctrs2
  610.       cpu_time 0
  611.  
  612.  
  613.       READ_KEY
  614.  
  615.       mov bx,fs:_WorkAdr
  616.       mov WORD PTR fs:[bx+2],1
  617.  
  618.       mov  ax,agl
  619.       mov  cx,fs:_FrameCounter
  620.       test cx,cx
  621.       jnz  @F
  622.       mov  cx,1
  623. @@:   add  ax,4*2
  624.       dec  cx
  625.       jnz  @B   
  626.       mov  fs:_FrameCounter,0 
  627.  
  628.  
  629.       cmp  ax,360*4     ;si l'angle >360° =>=0
  630.       jb  negal3
  631.       xor ax,ax
  632.       mov trs,al
  633.       mov agl,ax
  634.       Jmp part4
  635. negal3:
  636.       mov  agl,ax
  637.       jmp  part3
  638. ;*****************************************************************************
  639. Part4:
  640.        cmp  fs:_SyncFlag, 1
  641.        jnz  part4
  642.        mov  fs:_SyncFlag, 0
  643.  
  644.       mov      ax,0a000h
  645.       mov      es,ax
  646.  
  647.       cpu_time 48
  648.       ClearDots 
  649.     ;  clear_vga_screen
  650.  
  651.       cpu_time 32
  652.       loaddots  x32,y32,dt3  ;charge ds xv,xy,xz l'objet
  653.       convdots  dt3,dt4      ;transformation
  654.  
  655.       mov       bx,fs:_WorkAdr
  656.       mov       bx,WORD PTR fs:[bx]
  657.       mov       Dest,bx
  658.  
  659.       cpu_time 16
  660.       transf3c
  661.       inctrs2
  662.       cpu_time 0
  663.  
  664.       READ_KEY
  665.  
  666.       mov     bx,fs:_WorkAdr
  667.       mov     WORD PTR fs:[bx+2],1
  668.  
  669.       mov  ax,agl
  670.       mov  cx,fs:_FrameCounter
  671.       test cx,cx
  672.       jnz  @F
  673.       mov  cx,1
  674. @@:   add  ax,4*2
  675.       dec  cx
  676.       jnz  @B   
  677.       mov  fs:_FrameCounter,0 
  678.  
  679.       cmp  ax,360*4    ;si l'angle >360° =>=0
  680.       jb   negal4
  681.       xor  ax,ax
  682.       mov trs,al
  683.       mov agl,ax
  684.       jmp  part5
  685. negal4:
  686.       mov  agl,ax
  687.  
  688.       jmp part4
  689. ;*****************************************************************************
  690. Part5:
  691.        cmp  fs:_SyncFlag, 1
  692.        jnz  part5
  693.        mov  fs:_SyncFlag, 0
  694.  
  695.       mov   ax,0a000h
  696.       mov   es,ax
  697.  
  698.       cpu_time 48
  699.       ClearDots
  700.      ; clear_vga_screen
  701.  
  702.       cpu_time 32
  703.       loaddots  x32,y32,dt4  ;charge ds xv,xy,xz l'objet
  704.       convdots  dt4,dt5      ;transformation
  705.  
  706.       mov       bx,fs:_WorkAdr
  707.       mov       bx,WORD PTR fs:[bx]
  708.       mov       Dest,bx
  709.  
  710.       cpu_time 16 
  711.       transf3a
  712.       inctrs2
  713.       cpu_time 0
  714.  
  715.       READ_KEY
  716.  
  717.       mov bx,fs:_WorkAdr
  718.       mov WORD PTR fs:[bx+2],1
  719.  
  720.       mov  ax,agl
  721.       mov  cx,fs:_FrameCounter
  722.       test cx,cx
  723.       jnz  @F
  724.       mov  cx,1
  725. @@:   add  ax,4*2
  726.       dec  cx
  727.       jnz  @B   
  728.       mov  fs:_FrameCounter,0 
  729.  
  730.       cmp  ax,360*4   ;si l'angle >360° =>=0
  731.       jb   negal5
  732.       xor ax,ax
  733.       mov trs,al
  734.       mov agl,ax
  735.       Jmp part6
  736. negal5:
  737.       mov  agl,ax
  738.       jmp  part5
  739. ;*****************************************************************************
  740. Part6:
  741.        cmp  fs:_SyncFlag, 1
  742.        jnz  part6
  743.        mov  fs:_SyncFlag, 0
  744.  
  745.       mov   ax,0a000h
  746.       mov   es,ax
  747.  
  748.       cpu_time 48
  749.       ClearDots
  750.      ; clear_vga_screen
  751.  
  752.       cpu_time 32
  753.       loaddots  x32,y32,dt5  ;charge ds xv,xy,xz l'objet
  754.       convdots  dt5,dt6      ;transformation
  755.  
  756.       mov       bx,fs:_WorkAdr
  757.       mov       bx,WORD PTR fs:[bx]
  758.       mov       Dest,bx
  759.  
  760.       cpu_time 16
  761.       transf3b
  762.       inctrs2
  763.       cpu_time 0
  764.  
  765.       READ_KEY
  766.  
  767.       mov bx,fs:_WorkAdr
  768.       mov WORD PTR fs:[bx+2],1
  769.  
  770.       mov  ax,agl
  771.       mov  cx,fs:_FrameCounter
  772.       test cx,cx
  773.       jnz  @F
  774.       mov  cx,1
  775. @@:   add  ax,4*2
  776.       dec  cx
  777.       jnz  @B   
  778.       mov  fs:_FrameCounter,0 
  779.  
  780.       cmp  ax,360*4  ;si l'angle >360° =>=0
  781.       jb  negal6
  782.       xor ax,ax
  783.       mov trs,al
  784.       mov agl,ax
  785.       Jmp part7
  786. negal6:
  787.       mov  agl,ax
  788.       jmp  part6
  789. ;*****************************************************************************
  790. Part7:
  791. ;     sw_pages
  792.        cmp  fs:_SyncFlag, 1
  793.        jnz  part7
  794.        mov  fs:_SyncFlag, 0
  795.  
  796.       mov   ax,0a000h
  797.       mov   es,ax
  798.  
  799.       cpu_time 48
  800.       ClearDots
  801.      ; clear_vga_screen
  802.  
  803.       cpu_time 32
  804.       loaddots  x32,y32,dt6  ;charge ds xv,xy,xz l'objet
  805.       convdots  dt6,dt5      ;transformation
  806.  
  807.       mov       bx,fs:_WorkAdr
  808.       mov       bx,WORD PTR fs:[bx]
  809.       mov       Dest,bx
  810.  
  811.       cpu_time 16
  812.       transf3a
  813.       inctrs2
  814.       cpu_time 0
  815.  
  816.       READ_KEY
  817.  
  818.       mov bx,fs:_WorkAdr
  819.       mov WORD PTR fs:[bx+2],1
  820.  
  821.  
  822.       mov  ax,agl
  823.       mov  cx,fs:_FrameCounter
  824.       test cx,cx
  825.       jnz  @F
  826.       mov  cx,1
  827. @@:   add  ax,4*2
  828.       dec  cx
  829.       jnz  @B   
  830.       mov  fs:_FrameCounter,0 
  831.  
  832.       cmp  ax,360*4  ;si l'angle >360° =>=0
  833.       jb  negal7
  834.       xor ax,ax
  835.       mov trs,al
  836.       mov agl,ax
  837.       Jmp part8
  838. negal7:
  839.       mov  agl,ax
  840.       jmp  part7
  841. ;*****************************************************************************
  842. Part8:
  843. ;     sw_pages
  844.        cmp  fs:_SyncFlag, 1
  845.        jnz  part8
  846.        mov  fs:_SyncFlag, 0
  847.  
  848. ;===================== Fade Palette ===========================
  849.  
  850. ;;;;;;;;;; plante pas !!!!!!
  851.  
  852.          cmp     FadeFlag,255
  853.          jb      NewFade2
  854.  
  855.          mov     fs:_FadeON,0  ; plus fader ...
  856.  
  857.          cmp     Termine,1    ; Terminer si dernier fade fini
  858.          je      fin
  859.  
  860.          mov     fs:_FadeON,0    ; don't set _TmpPal anymore ...
  861.          jmp     @F
  862. NewFade2: mov     ax,FadeFlag  ; average Black-MyPal
  863.          push    ax
  864.          push    fs
  865.          push    OFFSET _TmpPal
  866.          mov     ax,FadePtr1+2
  867.          push    ax         
  868.          mov     ax,FadePtr1
  869.          push    ax
  870.          mov     ax,FadePtr2+2 
  871.          push    ax
  872.          mov     ax,FadePtr2
  873.          push    ax
  874.          call    _AveragePAL
  875.          add     sp,7*2
  876.          mov     fs:_FadeON,1         ; set new PAL during next VR !!!!
  877.          mov     cx,fs:_FrameCounter
  878.          sub     cx,Delai             ; temps chargement
  879.          mov     Delai,0              ; plus delai ....
  880.          test    cx,cx
  881.          jnz     Faddi2
  882.          mov     cx,1
  883. Faddi2:   add     FadeFlag,4           ; inc fade ..
  884.          dec     cx
  885.          jnz     Faddi
  886. @@:
  887.  
  888. ;;;;;;; plante pas !!!!!!
  889.  
  890.  
  891.  
  892. ;==============================================================
  893.  
  894.  
  895.          pushad
  896.          MPUSH    ds,es,fs,gs
  897.  
  898. ;==============================================
  899.          mov      ax,DGROUP
  900.          mov      ds,ax                   ; xchg FS,DS
  901.          mov      ax,GOPI_DATA
  902.          mov      fs,ax
  903.          ASSUME   ds:DGROUP,fs:GOPI_DATA
  904.  
  905. ;----------- test if we must finish ... ----------
  906.  
  907.          mov      _ReplayInfo.numChannels,4 ; 4 voices
  908.          
  909.          les     bx,DWORD PTR [_MP]
  910.          push    ds
  911.          push    OFFSET _ReplayInfo
  912.  
  913.          ; _MP->GetInformation(&ReplayInfo)
  914.  
  915.          call    (ModulePlayer PTR es:[bx]).GetInformation
  916.          add     sp,4
  917.  
  918.          mov     ax,_ReplayInfo.pos
  919.          shl     eax,14
  920.          or      ax,_ReplayInfo.row
  921.          or      ah,al
  922.          shr     eax,8
  923.          cmp     ax,WORD PTR fs:[FinSong]; is it time ????
  924.          jb      @F                      ; to fade off ???
  925.  
  926.          mov     ax,DGROUP
  927.          mov     fs,ax
  928.          mov     ax,GOPI_DATA
  929.          mov     ds,ax
  930.          ASSUME  ds:GOPI_DATA,fs:DGROUP
  931.  
  932.          mov     Termine,1
  933.  
  934.          cmp     FadePtr2,OFFSET _BlackPal
  935.          je      @F
  936.          mov     FadeFlag,0
  937.          mov     eax,DWORD PTR [FadePtr2]
  938.          mov     DWORD PTR [FadePtr1],eax   ; fade to black !!!!
  939.          mov     ax,fs
  940.          mov     FadePtr2+2,ax
  941.          mov     FadePtr2,OFFSET _BlackPal
  942.  
  943. @@:      xor     eax,eax
  944.  
  945.          MPOP    ds,es,fs,gs
  946.          popad
  947.          nop
  948.  
  949.       mov      ax,0a000h
  950.       mov      es,ax
  951.  
  952.       cpu_time 48
  953.       ClearDots
  954.      ; clear_vga_screen
  955.  
  956.       cpu_time 32
  957.       loaddots  x32,y32,dt5  ;charge ds xv,xy,xz l'objet
  958.       
  959.       mov       bx,fs:_WorkAdr
  960.       mov       bx,WORD PTR fs:[bx]
  961.       mov       Dest,bx
  962.  
  963.       cpu_time 16
  964.       transf3c
  965.       cpu_time 0
  966.  
  967.       READ_KEY
  968.  
  969.       mov bx,fs:_WorkAdr
  970.       mov WORD PTR fs:[bx+2],1
  971.  
  972.       mov  ax,agl
  973.       mov  cx,fs:_FrameCounter
  974.       test cx,cx
  975.       jnz  @F
  976.       mov  cx,1
  977. @@:   add  ax,4*2
  978.       dec  cx
  979.       jnz  @B   
  980.       mov  fs:_FrameCounter,0 
  981.  
  982.       cmp  ax,360*4  ;si l'angle >360° =>=0
  983.       jb  negal8
  984.       xor ax,ax
  985.       mov trs,al
  986.       mov agl,ax
  987.       Jmp fin
  988. negal8:
  989.       mov  agl,ax
  990.       jmp  part8
  991.  
  992. ;*****************************************************************************
  993.  
  994. fin:
  995.  
  996.       mov    fs:_FadeON,0
  997.  
  998.       mov    ax,0a000h
  999.       mov    es,ax
  1000.       xor    di,di        ; !!!!!! 
  1001.       mov    dx,3c4h
  1002.       mov    ax,0f02h
  1003.       out    dx,ax
  1004.       mov    cx,65536/4   ; clear 256ko de Video
  1005.       xor    eax,eax
  1006.       rep    stosd
  1007.  
  1008.       Free_Keyboard
  1009.  
  1010.       mov     ax,HeapSeg            ; segment to free
  1011.       mov     es,ax
  1012.       mov     ah,49h                ; MFREE
  1013.       int     21h
  1014.  
  1015.  
  1016.  
  1017.       MPOP    ds,es,fs,gs
  1018.       popad               ; restore
  1019.       nop
  1020.  
  1021.  
  1022.       leave
  1023.       retf
  1024. _GOPI ENDP
  1025.  
  1026. GOPI_TEXT ENDS
  1027. end
  1028.